#include <cwchar>
#include <iostream>

#include <locale.h>
#include <stdio.h>

// 删除指定位置的字符
bool DeleteUnicodeCharAtPosition(wchar_t *str, int pos, int len) {
    if (pos < 0 || pos >= len) return false;
    std::wmemmove(str + pos, str + pos + 1, len - pos);
    return true;
}

/**
 * @brief 判断字符是否为半角字符（占1个单位宽度）
 * @param ch 待判断的宽字符
 * @return true 表示半角，false 表示全角
 */
bool IsHalfWidthCharacter(wchar_t ch) {
    // 基础ASCII可打印字符（半角）
    if (ch >= L'\x0020' && ch <= L'\x007E') {
        return true;
    }

    // 扩展支持：制表符、不换行空格等特定半角字符
    if (ch == L'\t' ||       // 制表符 (U+0009)
        ch == L'\u00A0' ||   // 不换行空格 (U+00A0)
        ch == L'\u2002' ||   // 半角空格 (EN Space)
        ch == L'\u2003') {   // 全角空格 (EM Space，此处特例按半角处理)
        return true;
    }

    // // 默认规则
    // if (ch >= L'\x0020' && ch <= L'\x007E') return true;

    // // 扩展：支持部分拉丁字符（如 ñ, ç）
    // if (ch >= L'\x00A1' && ch <= L'\x00FF') return true; 

    // // 扩展：支持全角空格按1单位处理（特例）
    // if (ch == L'\u3000') return true;

    // 其他情况默认视为全角（占2单位）
    return false;
}

// 计算显示长度（基于字符是否为CJK）
int CalculateDisplayLength(const wchar_t *str, int startPos, int endPos) {
    int length = 0;
    // 增加对结束符的判断：i < endPos && str[i] != L'\0'
    for (int i = startPos; i < endPos && str[i] != L'\0'; ++i) {
        if (IsHalfWidthCharacter(str[i])) {
            length += 1;
        } else {
            length += 2;
        }
    }
    return length;
}

int FindEndPosForContainerWidth(const wchar_t* str, int startPos, int containerWidth) {
    int currentWidth = 0;
    int i = startPos;
    int len = static_cast<int>(std::wcslen(str));

    while (i < len && currentWidth < containerWidth) {
        wchar_t ch = str[i];
        // 判断是否为半角字符（1个单位）
        int charWidth = IsHalfWidthCharacter(ch) ? 1 : 2;

        // 若添加后超限则停止
        if (currentWidth + charWidth > containerWidth) {
            break;
        }

        currentWidth += charWidth;
        i++;
    }

    return i;
}

// 调整后的测试函数示例
int UnicodeTest1() {
    const wchar_t str[] = L"你好，Hello, 世界!";
    int len = std::wcslen(str);
    int startPos = 3;
    int endPos = 10;

    // 直接使用位置（无需调整起始位置）
    if (startPos >= endPos) {
        std::wcout << L"Invalid range\n";
        return 1;
    }

    int displayLength = CalculateDisplayLength(str, startPos, endPos);// 不包含 endPos
    std::wcout << L"Display length: " << displayLength << std::endl;
    return 0;
}


int UnicodeTest2()
{
    wchar_t str[] = L"你好，世界!"; // UTF-8编码的字符串
    int pos = 6;                  // 假设我们要删除位置7的字符

    // for (int i = 0; i < (int)std::wcslen(str) +1; i++) {
    //     printf("%X- ", str[i]);
    // }
    // printf("before str: %lld. end\n", std::wcslen(str));

    if (DeleteUnicodeCharAtPosition(str, pos, std::wcslen(str))) {
        wprintf(L"After del str: %ls\n", str);
    } else {
        wprintf(L"Invalid position or not a start of a UTF-8 character.\n");
    }
    return 0;
}

int UnicodeTest3()
{
    const wchar_t str[] = L"你好，Hello, 世界!";
    int startPos = 0;
    int containerWidth = 7; // 容器宽度为7个显示单位

    int endPos = FindEndPosForContainerWidth(str, startPos, containerWidth);
    std::wcout << L"End position for width " << containerWidth << L": " << endPos << std::endl;

    // 打印截取的子字符串
    std::wcout << L"Substring: ";
    for (int i = startPos; i < endPos; i++) {
        std::wcout << str[i];
    }
    std::wcout << std::endl;

    return 0;
}

int main()
{
    setlocale(LC_ALL, ""); // "chs" 是简体中文区域的常用代码
    wprintf(L"1你好，世界！\n");
    std::wcout << std::endl;
    UnicodeTest1();
    std::wcout << std::endl;
    UnicodeTest2();
    std::wcout << std::endl;
    UnicodeTest3();
    return 0;
}